/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

// 这是环状结构题目的2.0
// 除了验证是否是环状链表之外,还要找到链表是在哪一个节点还是成为环状的
// 然后,根据数学验证,我们发现:
// 在快慢指针相遇之后,即在环状某节点验证了环状结构之后
// 该节点剩下的到达环状开头节点的路程和链表头节点到达环状开头节点路程一致
// 所以,只要再在链表头节点定义一个指针,慢指针和该指针同步走,相遇之后的节点就是环状的开始节点

typedef struct ListNode ListNode ;

struct ListNode *detectCycle(struct ListNode *head) 
{

    ListNode *fast , *slow ;

    fast = slow = head ;

    while (fast && fast -> next)
    {

        slow = slow -> next ;

        fast = fast -> next -> next ;

        if (fast == slow)
        {

            ListNode* pcur = head ;

            while (pcur != slow)
            {

                pcur = pcur -> next ;

                slow = slow -> next ;

            }

            return pcur ;

        }

    }

    return NULL ;
    
}